package ch15;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ArrayLisAndLinkedList {
    public static void main(String[] args) {
        /* ArrayList和LinkedList实现原理:
            ArrayList 通过数组实现，一旦我们实例化 ArrayList 无参数构造函数默认为数组初始化长度为
            10②,add 方法底层实现如果增加的元素个数超过了 10 个，
            那么 ArrayList 底层会新生成一个数组，长度为原数组的 1.5 倍+1，
            然后将原数组的内容复制到新数组当中，并且后续增加的内容都会放到新数组当中。
            ，重复该过程。是一旦数组超出长度，就开始扩容数组。
            扩容数组调用的方法 Arrays.copyOf(objArr, objArr.length + 1);

            LinkedList 底层的数据结构是基于双向循环链表的，且头结点中不存放数据,
            既然是双向链表，那么必定存在一种数据结构——我们可以称之为节点，节点实例保存业务数据，
            前一个节点的位置信息和后一个节点位置信息

            区别:
            1.ArrayList是实现了基于动态数组结构,LinkedList是基于链表数据结构.
            2.对于随机访问get和set,ArrayList优于Linkedlist,
            因为ArrayList可以随机定位,而linkedList要移动指针一步一步的移动到节点处.
            3.对于新增和删除操作,linkedlist比较占优势,只需要对指针进行修改即可,
            而ArrayList要移动数据来填补被删除的对象的空间

 使用场景
（1）如果应用程序对各个索引位置的元素进行大量的存取操作，ArrayList对象要远优于LinkedList对象；
（2）如果应用程序主要是对列表元素进行循环，并且循环时候进行插入或者删除操作，LinkedList对象要远优于ArrayList对象
 */
        long start=System.nanoTime();
        List l=new ArrayList();

        for(int i=1;i<=100000;i++){
            int b=(int)(Math.random()*100+1);
            l.add(b);
        }
        for(int j=0;j<100;j++){
            int c=(int)(Math.random()*100+1);
            l.remove(c);
        }
        long end=System.nanoTime();
        long reslut=end-start;
        System.out.println("ArrayList花费的时间为："+reslut+"毫微秒");

        //*************************
        long start1=System.nanoTime();
        List l1=new LinkedList();

        for(int i=1;i<=100000;i++){
            int d=(int)(Math.random()*100+1);
            l1.add(d);
        }
        for(int j=0;j<100;j++){
            int e=(int)(Math.random()*100+1);
            l1.remove(e);
        }
        long end1=System.nanoTime();
        long reslut1=end1-start1;
        System.out.println("LinkedList花费的时间为："+reslut1+"毫微秒");
        System.out.println("LinkedList与ArrayList的时间差为："+(reslut1-reslut)+"毫微秒");
    }
}
